package com.dzx.currentency.threadPool;

import ch.qos.logback.core.util.TimeUtil;
import lombok.extern.slf4j.Slf4j;

import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.*;

/**
 * @author DuanZhaoXu
 * @ClassName:
 * @Description:
 * @date 2018年11月20日 16:25:44
 */
@Slf4j
public class ThreadPoolExample1 {
    public static void main(String[] args) {
        ExecutorService service = Executors.newCachedThreadPool();

        service = Executors.newFixedThreadPool(3);

        service = Executors.newSingleThreadExecutor();

        for (int i = 0; i < 10; i++) {
            final int index = i;
            service.execute(() -> {
                log.info("task {}", index);
            });
        }

        service.shutdown();

        //Timer 组件
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                log.info("Timer组件的定时任务");
            }
        }, new Date());

        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                log.info("");
            }
        }, 3);

        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                log.info("开始时间");
                log.info("喵喵喵喵喵喵喵喵");
                log.info("结束时间");
            }
        }, 3000, 3000);


        timer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                log.info("开始时间");
                log.info("喵喵喵喵喵喵喵喵");
                log.info("结束时间");
            }
        }, 3000, 3000);


        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(10);
        //3秒之后执行
        scheduledExecutorService.schedule(() -> {
                    log.info("啦啦啦啦！");
                },
                3, TimeUnit.SECONDS);


        //3秒之后执行，前一个线程的执行开始时间 和 后一个 线程的执行开始时间相差2秒
        /**
         * command：执行线程
         * initialDelay：初始化延时
         * period：两次开始执行最小间隔时间
         * unit：计时单位
         */
        scheduledExecutorService.scheduleAtFixedRate(() -> {
            log.info("开始时间");
            log.info("啦啦啦啦啦啦啦啦啦！");
            log.info("结束时间");
        }, 3, 2, TimeUnit.SECONDS);


        //3秒之后执行，前一个线程的结束时间 和 后一个 线程的 开始时间相差2秒
        /**
         * command：执行线程
         * initialDelay：初始化延时
         * period：前一次执行结束到下一次执行开始的间隔时间（间隔执行延迟时间）
         * unit：计时单位
         */
        scheduledExecutorService.scheduleWithFixedDelay(() -> {
            log.info("开始时间");
            log.info("啦啦啦啦啦啦啦啦啦！");
            log.info("结束时间");
        }, 3, 5, TimeUnit.SECONDS);
    }
}
